From: Ray Strode Date: Fri, 7 Oct 2016 19:40:14 +0000 (-0400) Subject: objectManager: handle proxies coming and going X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~290 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=9c8a47093470f6ddacaa9bdbd6d982d5ecd9942c;p=gnome-shell.git objectManager: handle proxies coming and going Ever since commit b8e29ae8c78658917c8a8ddd391667d7d9e36971 (I think), start up is littered with this message: Gjs-WARNING **: JS ERROR: could not get remote objects for service org.gnome.SettingsDaemon.Smartcard path since gnome-shell is now started before gnome-settings-daemon. This commit addresses the problem by making the object manager code not try to autostart its proxy, and instead wait for it to appear. https://bugzilla.gnome.org/show_bug.cgi?id=772589 --- diff --git a/js/misc/objectManager.js b/js/misc/objectManager.js index c86e47ab4..835057f5e 100644 --- a/js/misc/objectManager.js +++ b/js/misc/objectManager.js @@ -46,7 +46,7 @@ const ObjectManager = new Lang.Class({ g_interface_info: ObjectManagerInfo, g_name: this._serviceName, g_object_path: this._managerPath, - g_flags: Gio.DBusProxyFlags.NONE }); + g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START }); this._interfaceInfos = {}; this._objects = {}; @@ -65,6 +65,9 @@ const ObjectManager = new Lang.Class({ }, _tryToCompleteLoad: function() { + if (this._numLoadInhibitors == 0) + return; + this._numLoadInhibitors--; if (this._numLoadInhibitors == 0) { if (this._onLoaded) @@ -86,7 +89,7 @@ const ObjectManager = new Lang.Class({ g_object_path: objectPath, g_interface_name: interfaceName, g_interface_info: info, - g_flags: Gio.DBusProxyFlags.NONE }); + g_flags: Gio.DBusProxyFlags.DO_NOT_AUTO_START }); proxy.init_async(GLib.PRIORITY_DEFAULT, this._cancellable, @@ -181,6 +184,18 @@ const ObjectManager = new Lang.Class({ return; } + this._managerProxy.connect('notify::g-name-owner', Lang.bind(this, function() { + if (this._managerProxy.g_name_owner) + this._onNameAppeared(); + else + this._onNameVanished(); + })); + + if (this._managerProxy.g_name_owner) + this._onNameAppeared(); + }, + + _onNameAppeared: function() { this._managerProxy.GetManagedObjectsRemote(Lang.bind(this, function(result, error) { if (!result) { if (error) { @@ -218,6 +233,21 @@ const ObjectManager = new Lang.Class({ })); }, + _onNameVanished: function() { + let objectPaths = Object.keys(this._objects); + for (let i = 0; i < objectPaths.length; i++) { + let object = this._objects[objectPaths]; + + let interfaceNames = Object.keys(object); + for (let j = 0; i < interfaceNames.length; i++) { + let interfaceName = interfaceNames[i]; + + if (object[interfaceName]) + this._removeInterface(objectPath, interfaceName); + } + } + }, + _registerInterfaces: function(interfaces) { for (let i = 0; i < interfaces.length; i++) { let info = Gio.DBusInterfaceInfo.new_for_xml(interfaces[i]);